#include "loop_queue.h"

int create_queue(loop_t **p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    *p=(loop_t*)malloc(sizeof(loop_t));
    if(NULL == *p){
        printf("内存分配失败\n");
        return -1;
    }
    (*p)->front=0;
    (*p)->rear=0;
    memset((*p)->loop,0,sizeof(int)*N);
    return 0;
}
int clean_queue(loop_t*p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    p->rear=p->front;
    return 0;
}
int destroy_queue(loop_t **p){
    if(NULL == p||NULL==*p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    free(*p);
    (*p)=NULL;
    return 0;
}
int is_full(loop_t*p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if((p->rear+1)%N==p->front){
        return 1;
    }else {
        return 0;
    }
}
int push_queue(loop_t*p,int num){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(is_full(p)){
        printf("队满 无法加入\n");
        return -1;
    }
    p->loop[p->rear] = num;
    p->rear = (p->rear + 1) % N;
    return 0;
}
int is_empty(loop_t *p){
    if(NULL == p){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    return p->front==p->rear ? 1 : 0;
}

int pop_queue(loop_t*p,int *buff){
    if(NULL == p|| NULL == buff){
        printf("入参为NULL 请检查\n");
        return -1;
    }
    if(1==is_empty(p)){
        printf("栈空 出队失败\n");
        return -1;
    }
    *buff=p->loop[p->front];
    p->front=(p->front+1)%N;
    return 0;

}
// 打印队列所有元素（不破坏队列结构
int print_queue(loop_t*p){
    if(NULL == p){
        printf("入参为NULL,请检查\n");
        return -1;
    }
    if(is_empty(p)){
        printf("队列为空\n");
        return 0;
    }
    int i = 0;
    i=p->front;
    while(i != p->rear){
        printf("%d ", p->loop[i]);
        i = (i + 1) % N;
    }
    printf("\n");
    return 0;


}
